"""
图像小部件。
"""
import typing

from .base import BaseWidget
from ..base import BaseSession, BaseSessionType, BaseSessionParentType
from ..framework import dispatch, session_received
from ..utils import callback, to_any, StringValue


@session_received
class WidgetImage(BaseSession, BaseWidget):
    """
    图像小部件类。
    """
    name: typing.ClassVar[str] = 'WidgetImage'

    @classmethod
    async def create(
            cls: typing.Type[BaseSessionType], parent: BaseSessionParentType, *args: typing.Any, **kwargs: typing.Dict
    ) -> BaseSessionType:
        """
        五个参数：
        @width: 宽度；
        @height: 高度；
        @x: 左上角横坐标；
        @y: 左上角纵坐标；
        @src: 图像的URL地址（可选，默认为None）
        使用方法：
        image = await WidgetImage.create(activity, 96, 96, 0, 0,
         'https://img2.baidu.com/it/u=1211232624,1554315570&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500')
        """
        if len(args) > 4:
            src = to_any(args[4], StringValue)
            return await super().create(parent, *cls.parse_region(*args), src, **kwargs)
        return await super().create(parent, *cls.parse_region(*args), to_any(None), **kwargs)

    async def on_receive(self, msg):
        """
        组件的事件转发。
        """
        await super().on_receive(msg)

        coro = self.on_get_src(*msg.argv, session_id=msg.session, future_id=msg.future) if msg.name == 'onGetSrc' else \
            super().on_widget_action(*msg.argv, name=msg.name, session_id=msg.session, future_id=msg.future)
        dispatch(coro)

    async def get_src(self) -> typing.Optional[str]:
        """
        获取图像的URL地址。
        """
        return await self.send_action_until_return('getSrc')

    @callback(typing.Union[str, None])
    async def on_get_src(self, src, session_id, future_id):
        """
        当获取图像URL地址后，此方法被调用。
        通常不需要关注此方法的实现。
        """
        self.set_action_result(session_id, future_id, src)

    async def set_src(self, src: typing.Optional[str]):
        """
        设置图像的URL地址。
        :param src: 图片URL，可以为None，如果是None表示不显示任何图像。
        """
        if src:
            dispatch(self.send_action('setSrc', to_any(src, StringValue)))
            return
        dispatch(self.send_action('setSrc', to_any(None)))
